import java.util.Stack;

// 使用栈先进先出的原则
// 遍历字符串：如果当前字符与栈顶字符相同，则弹出栈顶（表示消除这两个字符）否则，将当前字符压入栈。
// 最终栈中的字符就是无法进一步消除的最短字符串
public class Main3 {
    public static String finalString(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            // 非空且与外面的相等
            if (!stack.isEmpty() && stack.peek() == c) {
                stack.pop(); // 消除相同相邻字符
            } else {
                stack.push(c);
            }
        }
        // 将栈中字符转为字符串
        StringBuilder sb = new StringBuilder();
        for (char c : stack) {
            sb.append(c);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(finalString("abbc"));   // 输出 "ac"
        System.out.println(finalString("abba"));   // 输出 ""
        System.out.println(finalString("abc"));    // 输出 "abc"
    }
}